package connection
{
	// Grille de topographie du monde
	import com.greensock.*;
	import com.greensock.easing.*;
	
	import composants.Mur;
	
	import flash.display.Loader;
	import flash.display.Sprite;
	import flash.events.*;
	import flash.events.Event;
	import flash.events.MouseEvent;
	import flash.net.*;
	import flash.sampler.NewObjectSample;
	import flash.text.TextField;
	import flash.text.engine.BreakOpportunity;
	import flash.ui.Mouse;
	
	import mx.containers.Canvas;
	import mx.containers.HBox;
	import mx.containers.Panel;
	import mx.controls.Alert;
	import mx.controls.Button;
	import mx.controls.HSlider;
	import mx.core.UIComponent;
	import mx.managers.CursorManager;
	import mx.validators.EmailValidator;
	
	
	public class Salle extends Canvas
	{
		private var gridSize:uint=600; 
		private var taille:uint = 0;
		public  var pasSize:uint=100;
		private var echelleNormale:Number=60;
		private var x1:int=-1;
		private var y1:int=-1;
		private var scale:Number=1;
		public  var objetProportion:Number=1;
		public var tabMurs:Array       = new Array(); //tout mur instancié sera stocké dans cette variable
		public var tabOuvertures:Array = new Array(); //toute ouverture instanciée(oeuvre, fenetre, porte...) sera stocké dans cette variable
		public var idSalle:String;
		public var nomSalle:String;
		
		// Constructeur : création de la grille
		public function Salle(st:String)
		{	
			this.nomSalle = st;
			height=gridSize;
			width=gridSize;
		}
		
		//Réaffichage de la grille en fonction de la valeur du slider
		public function paint(valSlide:int):void
		{
			var i:int;
			var save:int = valSlide;
			graphics.clear();
			graphics.lineStyle(1,0,1);
			graphics.drawRect(0,0,gridSize,gridSize);
			graphics.lineStyle(1,0xcccccc,1);
			valSlide = echelleNormale - valSlide;
			pasSize = valSlide;
			objetProportion=pasSize/echelleNormale;
			
			// Pour tracer les lignes de la grille
			for( i = valSlide; i < gridSize;  i += valSlide)
			{
				graphics.moveTo(i,1);
				graphics.lineTo(i,gridSize);
				
				graphics.moveTo(1,i);
				graphics.lineTo(gridSize,i);
			}
			this.taille = (600/(60-save))*100;
		}
		
		// Fixe la taille du pas sur la grille
		public function setScale(pScale:Number):void
		{
			scale  = pScale;
			scaleX = pScale;
			scaleY = pScale;		
		}
		
		public function lireFichier(nomF:String):void
		{
			//On récupère le fichier sur le serveur:
			var request:URLRequest = new URLRequest("http://127.0.0.1/ProjetTaweb/Serveur/Accordeon/salles/"+nomF);
			var loader:URLLoader = new URLLoader();
			
			try
			{
				//Ecouteur d'évènements:
				loader.addEventListener(Event.COMPLETE, chargementMurs);
				loader.addEventListener(IOErrorEvent.IO_ERROR, erreur);
				loader.load(request);
			}
			catch(e:SecurityError)
			{
				Alert.show("Il y'a un problème de sécurité.");
				trace("Il y'a un problème de sécurité.");
			}
		}
		
		// Fonction indiquant si une erreur de chargmement survient :
		private function erreur( event:Event ):void {
			Alert.show(event+"");
			trace(event);
		}
		
		//Fonction qui parse le fichier xml récupéré:
		private function chargementMurs(event:Event):void
		{
			try
			{
				//On récupère les infos xml:
				var fichierXML:XML = new XML(event.target.data);
				
				//Variables intermédiaires:
				var pasSize:int = parseInt(fichierXML.@pas);
				var taille:int = parseInt(fichierXML.@taille);
				var idS:String = fichierXML.@id;
				var nomS:String = fichierXML.@name;
				
				this.taille = taille;
				this.pasSize = pasSize;
				this.idSalle = idS;
				//this.nomSalle = nomS;
				this.paint(this.echelleNormale - this.pasSize);
				
				//On parcourt le xml pour récupérer d'abord les balises "mur":
				for each(var MUR:XML in fichierXML..Wall)
				{	
					//Pour chaque "mur", on récupère les coordonnées "x1-Y1" et "x2-y2":
					var x1:int = (parseInt(MUR.Vertix[0].@x)*pasSize)/100;
					var y1:int = Math.abs((parseInt(MUR.Vertix[0].@y)-taille)*pasSize)/100; 
					var x2:int = (parseInt(MUR.Vertix[1].@x)*pasSize)/100;
					var y2:int = Math.abs((parseInt(MUR.Vertix[1].@y)-taille)*pasSize)/100;
					var mur:Mur = new Mur(x1,y1,x2,y2,x1+y1+x2);
					addChild(mur);
					tabMurs.push(mur);
					for each(var PORTE:XML in MUR..Objects..object)
					{	
						if (PORTE.@type == "porte")
						{
							var valX:int;
							var valY:int;
							var iy1:int = parseInt(PORTE.Vertix[0].@y);
							var idP:String = PORTE.@id;
							if (pasSize != 0) {
								iy1 = parseInt(PORTE.Vertix[0].@y)*pasSize/100;
								valX = parseInt(PORTE.Vertix[0].@x)*pasSize/100;
								valY  = Math.abs((parseInt(PORTE.Vertix[0].@y)-taille)*pasSize)/100
							}
							else {
								iy1 = parseInt(PORTE.Vertix[0].@y)/100;
								valX = parseInt(PORTE.Vertix[0].@x)/100;
								valY = Math.abs(iy1 - taille);
							}
							var col:uint = parseInt(PORTE.Color.@id);
							var porte:Porte = new Porte(valX, valY,idP, col);
							//porte.getBmpPorte().scaleX = objetProportion;
							//porte.getBmpPorte().scaleY = objetProportion; 
							porte.paint(x1,y1,x2,y2);
							addChild(porte);
							tabOuvertures.push(porte);
						}
					}		
				}
			}	
			catch(e:TypeError)
			{
				//Si il y a une erreur:
				Alert.show("Impossible de récupérer le contenu du xml");
			}
		}
		
		private var idPorte:String;
		private var idColor:uint;
		public function modifFichierSalle(idPorte:String, idColor:uint):void
		{
			//On récupère le fichier sur le serveur:
			var request:URLRequest=new URLRequest("http://127.0.0.1/ProjetTaweb/Serveur/Accordeon/salles/"+this.nomSalle+".xml?");
			var loader:URLLoader=new URLLoader();
			this.idPorte = idPorte;
			this.idColor = idColor;
			try
			{
				//Ecouteur d'évènements:
				loader.load(request);
				loader.addEventListener(Event.COMPLETE, majFichierSalle);
				loader.addEventListener(IOErrorEvent.IO_ERROR, erreurF);
			}
			catch (e:SecurityError)
			{
				Alert.show("Il y'a un problème de sécurité.");
				trace("Il y'a un problème de sécurité.");
			}
		}
		
		/**
		 * Fonction indiquant si une erreur de chargmement survient
		 */ 
		private function erreurF(event:Event):void
		{
			Alert.show(event + "");
			trace(event);
		}
		
		/**
		 * Fonction qui parse le fichier xml récupéré
		 */ 
		private function majFichierSalle(event:Event):void
		{
			try
			{
				//On récupère les infos xml:
				var salleXML:XML=new XML(event.target.data);
				var xmlObject : XMLList = salleXML..Wall.Objects.object.(hasOwnProperty("@type") && @type == "porte" && hasOwnProperty("@id") && @id == this.idPorte);
				
				//On modifie alors cet identifiant dans le xml:
				xmlObject..Color.@id= this.idColor.toString();
				//On envoie le traitement au script php:
				
				var myRequest:URLRequest=new URLRequest("http://127.0.0.1/ProjetTaweb/UploaderScript.php");
				var myLoader:URLLoader=new URLLoader();
				var myVariables:URLVariables=new URLVariables();
				
				myVariables.RoomName = this.nomSalle;
				myVariables.XMLDescription=salleXML;
				
				myRequest.method=URLRequestMethod.POST; //met XMLDescription dans $_POST[] pour être récupéré par le script PHP
				myRequest.data=myVariables;
				myLoader.load(myRequest);
			}
			catch (e:TypeError)
			{
				//Si il y a une erreur:
				Alert.show("Impossible de récupérer le contenu du xml");
				trace("Impossible de récupérer le contenu du xml");
				trace(e.message);
			}
		}

		public function zoom(taille:String):void
		{
			switch (taille) {
				case "plusGrand" : if(scale<1) setScale(scale+0.1);
					break;
				case "plusPetit" : if(scale>=0.4) setScale(scale-0.1);
					break;
				case "normal" :    setScale(0.5);
					break;
			}
		}
	}
}